package com.ts.api.aspect.handler;

import com.gitee.apanlh.util.algorithm.digest.MD5;
import com.gitee.apanlh.util.base.Eq;
import com.gitee.apanlh.util.valid.ValidParam;
import com.ts.api.common.constant.api.ApiEnum;
import com.ts.api.common.context.ApiContext;
import com.ts.api.common.localcache.DistrictCache;
import com.ts.api.module.api.entity.ApiUserRequest;
import com.ts.api.module.api.entity.po.ApiLogPO;
import com.ts.api.module.api.entity.vo.ReqApiParameterVO;
import com.ts.api.module.common.entity.DistrictPO;
import org.springframework.stereotype.Component;

/**
 *  API渠道业务日志处理
 *
 *  @author Pan
 */
@Component
public class ApiLogAspectHandler {

    /**
     *  请求参数日志记录
     *
     *  @param logPO    日志实体对象
     */
    public void handlerRequestParameter(ApiLogPO logPO) {
        //  解密参数
        String decryptData = ApiContext.DECRYPT_DATA.get();
        if (ValidParam.isNotEmpty(decryptData)) {
            logPO.setDecryptData(decryptData);
        } else {
            logPO.setDecryptData("无须解密");
        }

        //  请求参数
        ReqApiParameterVO reqApiParameterVO = ApiContext.REQ_PARAMS.get();
        if (reqApiParameterVO == null) {
            return ;
        }

        ApiUserRequest apiUserRequest = reqApiParameterVO.getApiUserRequest();
        if (apiUserRequest == null) {
            logPO.setAreaName("无传递请求用户参数");
            return ;
        }

        //  获取城市
        String city = apiUserRequest.getCity();
        DistrictPO districtPO = DistrictCache.getByName(city);
        if (ValidParam.isNotNull(districtPO)) {
            logPO.setAreaCode(districtPO.getCode());
            logPO.setAreaName(districtPO.getName());
        } else {
            logPO.setAreaName("不支持[" + city + "]该城市");
        }

        String phoneMd5;
        //  进件获取手机号md5
        String phone = apiUserRequest.getPhone();
        if (ValidParam.isNotEmpty(phone)) {
            phoneMd5 = MD5.create().digestToHex(phone);
        } else {
            //  撞库自带md5
            phoneMd5 = apiUserRequest.getPhoneMd5();
        }

        //  手机号掩码模式
        if (ValidParam.isNotEmpty(apiUserRequest.getPhoneMask())) {
            phoneMd5 = apiUserRequest.getPhoneMask();
        }
        logPO.setPhoneMd5(phoneMd5);
    }

    /**
     *  清理并发异常日志
     *
     *  @param logPO    日志实体对象
     */
    public void clearConcurrentError(ApiLogPO logPO) {
        // 如果是并发异常的话，不保存报文数据，节省数据库存储空间
        if (Eq.str(logPO.getEventCode(), Integer.toString(ApiEnum.API_DATA_EXCHANGE_DISCARD.getCode()))) {
            logPO.setReqHeader(null);
            logPO.setReqData(null);
            logPO.setDecryptData(null);
            logPO.setRespData(null);
        }
    }
}
